<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数增强</title>
</head>
<body>
    <script>
        //设置函数参数的默认值
        //es5方式
        // function fn(name,age){
        //     name = name ||"tom";
        //     age=age || 17;
        //     console.log(name+" "+age);
        // }
        // //es5+类型检查
        // function fn1(name,age){
        //     name=(typeof name!='undefined'?name:'tom');//判断是否被赋值，如果没有则执行：后面的表达式
        //     age=(typeof age!='undefined'?age:17);//同样，age等于undefined，执行假条件，给赋值17
        //     console.log(name+"  "+age);
        // }
        // //es6方式
        // function fn2(name="tom",age=17){//直接在参数后面写初始值最简便。
        //     console.log(name+" "+age);//es6利于代码优化。
        // }
        // fn();
        // fn1();
        // fn2();

        //2.5.2 rest参数
        //es5方式
        // function join(){
        //     var str="";
        //     for(var i=0;i<arguments.length;i++)
        //     {
        //         if(i==0)
        //         {
        //             str=arguments[i];
        //         }else{
        //             str+="|"+arguments[i];
        //         }
        //     }
        //     return str;
        // }
        // console.log(join("hello","world"));
        // //es6
        // function join2(...strs){
        //     var str="";
        //     for(var i=0;i<strs.length;i++)
        //     {
        //         if(i==0)
        //         {
        //             str=strs[i];
        //         }else{
        //             str+="|"+strs[i];
        //         }
        //     }
        //     return str;
        // }
        // console.log(join2("hello","world"));
        //join用的传统的arguments对象完成的，join2用的rest参数，可以向函数传入任意数目的参数，最终结果一样
        
        // 2.33rest参数应用-计算器
        // function calculate(method,...nums)//calculate函数是负责计算的函数，第一个参数代表运算符，后面的运算符个数不限，用rest参数进行接受
        // {
        //     let result;
        //     if(!method||nums.length ==0)
        //     {
        //         alert("请输入参数");
        //         return;
        //     }
        //     if(method=='*')
        //     {
        //         result=1;
        //         for(let i=0;i<nums.length;i++)
        //         {
        //             result*=nums[i];
        //         }
        //     }else if(method=='+'){
        //         result=0;
        //         for(let i=0;i<nums.length;i++)
        //         {
        //             result+=nums[i];
        //         }
        //     }
        //     alert(result);
        // }
        // calculate("+",1,2);//3
        // calculate("+",1,2,3,4,5);//15
        // calculate("*",1,2,3);//6
        // calculate("*",1,2,3,4,5);//120

        //2.53 严格模式
        //非严格模式
        // function test1(a){//实参传入后传到arguments后argments重新赋值34，所以打印出来就是a=34
        //     arguments[0]=34;
        //     console.log(a);
        // }
        // //严格模式
        // function test2(a){//严格模式，严格执行实参，不执行重新赋值的操作
        //     "use strict";
        //     arguments[0]=34;
        //     console.log(a);
        // }

        // // function test3(a,b=10){
        // //     'use strict';//会报错 //函数参数只要使用了默认值，解构赋值，扩展运算符，那么函数内部就不能使用严格模式，否则报错
        // // };
        // test1(20);
        // test2(20);
        // test3(5);

        // 2.5.4 name属性
        //匿名函数(匿名函数es5和es6返回值不同，f相当于一个匿名函数)
        // var f=function(){};
        // //es5
        // console.log(f.name);//""
        // //es6
        // console.log(f.name);//'f'
        // //具名函数(给一个具名函数赋一个变量，则es5和es6的name属性都返回这个具名函数的名字)
        // const myfun=function fun(){};
        // //es5
        // console.log(myfun.name);//'fun'
        // //es6
        // console.log(myfun.name);//'fun'
        

        //箭头函数
        // (普通函数)
        // function Counter(){
        //     this.num=0;
        //     this.timer=setInterval(function add(){//原因：setInterval函数里面this被绑定到全局对象window上，window.num没定义所以打印出NaN。
        //         this.num++;
        //         console.log(this.num);
        //     },1000);
        // }
        // var a=new Counter();//每过一秒打印出一个NaN
        //箭头函数不会导致this被重新绑定到全局对象。
        function Counter(){
            this.num=0;
            this.timer=setInterval(()=>{
                this.num++;
                console.log(this.num);
            },1000);
        }
        var a=new Counter();

    </script>
</body>
</html>
